var bleUtils = require('ble-utils.js');
var util = require("util.js");
var app = getApp();

//点击界面设备列表的时候可以拿到对应的device
//链接设备并写入10指令
function connectDevice(device,upgradeCallback) {
 bleUtils.createBLEConnection({
    deviceId: device.deviceId,
    timeOut: 5000
  }).then(function (res) {
    //设备链接成功后记得停止扫描
    bleUtils.stopBluetoothDevicesDiscovery({})
    return bleUtils.getBLEDeviceServices({//获取设备对应的服务
      deviceId: device.deviceId
    })
  },function(err){
    console.log("to dfu连接失败",err);
    if (app.globalData._that){
      app.globalData._that.setData({
        loading_show: false
      });
    }
  }).then(function (res) {
    console.log("设备的服务信息",res);
    //获取1530的服务
    for(var i=0;i<res.services.length;i++){
      var uuid = res.services[i]["uuid"]
      if (uuid.indexOf("00001530") != -1 ) {
        console.log("服务uuid-->", uuid);
        device.fee7 = res.services[i] 
      }
    }
    if (!device.fee7) {
      throw new Error('服务uuid不存在');
    }
    console.log("服务uuid", device.fee7["uuid"]);
    return bleUtils.getBLEDeviceCharacteristics({//获取特征值
      deviceId: device.deviceId,
      serviceId: device.fee7["uuid"]
    })
  }).then(function (res) {
    console.log("设备特征码",res);
    for (var i in res.characteristics) {
      var c = res.characteristics[i]
      if (c.uuid.indexOf('00001531') != -1) {
        device.fec7 = c
      }
    }
 
    //监听服务接口
    return bleUtils.notifyBLECharacteristicValueChange({
      state: true, // 启用 notify 功能
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId: device.deviceId,
      // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
      serviceId: device.fee7["uuid"],
      // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
      characteristicId: device.fec7.uuid,
    })
    
  }).then(function (res) {
      //控制盒状态变更为dfu升级模式
      setTimeout(function () {
        var hex = '0106'//对应的进入dfu的指令
        var buffer = util.bufferFromHex(hex)
        console.log("发送进入dfu命令", buffer, device);
        var startUpgradeFlg = false;
        bleUtils.writeBLECharacteristicValue({
          deviceId: device.deviceId,
          serviceId: device.fee7["uuid"],
          characteristicId: device.fec7.uuid,
          value: buffer
        }).then(function (res) {//关闭蓝牙
          startUpgradeFlg = true;
          console.log("开始升级。。。。");
          bleUtils.closeBLEConnection({
            deviceId: device.deviceId
          }).then(function (res) {
            console.log("dfu关闭蓝牙成功")
            return bleUtils.closeBluetoothAdapter({})//关闭adapter,否则后面会在部分Android机上搜不到dfu
          },function(res){
            console.log("dfu关闭蓝牙失败")
            return bleUtils.closeBluetoothAdapter({})//关闭adapter,否则后面会在部分Android机上搜不到dfu
          }).then(function(){
            //跳转到dfuConfig页面
            console.log("进入dfu模式，duf模式下，蓝牙的deviceid会改变，设备名称也会改变", device);
            if (upgradeCallback != null) {
              setTimeout(function () {
                upgradeCallback();
              }, 500);
            }
          })          
        }, function (err) {
          bleUtils.closeBLEConnection({
            deviceId: device.deviceId
          }).then(function (res) {
            bleUtils.closeBluetoothAdapter({})//关闭adapter,否则后面会在部分Android机上搜不到dfu
          })
          //跳转到dfuConfig页面
          console.error("发送失败", device, err);
        })
        
        //检测因进入dfu模式丢包造成无法继续升级的优化
        setTimeout(function(){
          if (!startUpgradeFlg) {
            console.log("启动升级。。。。");
            bleUtils.closeBLEConnection({
              deviceId: device.deviceId
            }).then(function (res) {
              return bleUtils.closeBluetoothAdapter({})//关闭adapter,否则后面会在部分Android机上搜不到dfu
            }).then(function () {
              //跳转到dfuConfig页面
              console.log("启动后进入dfu模式，duf模式下，蓝牙的deviceid会改变，设备名称也会改变", device);
              if (upgradeCallback != null) {
                setTimeout(function () {
                  upgradeCallback();
                }, 500);
              }
            })          
          }
        },500);

      }, 500);
   }).catch(err => {
     console.log("err")
   })
}



module.exports = {
  connectDevice: connectDevice
}